package laborum2011.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import laborum2011.excepcion.DAOExcepcion;
import laborum2011.modelo.Oferta;
import laborum2011.util.ConexionBD;

public class OfertaDAO extends BaseDAO{
	public int insertarOferta(Oferta vo) throws DAOExcepcion {
		System.out.println("OfertaDAO: insertarOferta(Oferta vo)");
		String query = "insert into oferta(id_empresa, titulo, vacantes, fec_inicio,fec_fin, cargo, desc_cargo, estado) " +
				"values (?, ?, ?, ?, ?, ?, ?, ?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		int id = 0;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, vo.getId_empresa());
			stmt.setString(2, vo.getTitulo());
			stmt.setInt(3, vo.getVacantes());
			stmt.setDate(4, vo.getFec_inicio());
			stmt.setDate(5, vo.getFec_fin());
			stmt.setInt(6, vo.getCargo());
			stmt.setString(7, vo.getDesc_cargo());
			stmt.setString(8, vo.getEstado());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			query = "SELECT LAST_INSERT_ID()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				id = rs.getInt(1);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return id;
	}
	
	@SuppressWarnings("deprecation")
	public void modificarOferta(Oferta vo) throws DAOExcepcion{
		System.out.println("OfertaDAO: modificarOferta(Oferta vo)");
		String query = "update oferta set id_empresa=?,titulo=?,vacantes=?,fec_inicio=?,fec_fin=?,cargo=?,desc_cargo=?,estado=? " +
				"where id_oferta = ? and estado = 1;";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, vo.getId_empresa());
			stmt.setString(2, vo.getTitulo());
			stmt.setInt(3, vo.getVacantes());
			stmt.setDate(4, new java.sql.Date(vo.getFec_inicio().getDate()));
			stmt.setDate(5, new java.sql.Date(vo.getFec_fin().getDate()));
			stmt.setInt(6, vo.getCargo());
			stmt.setString(7, vo.getDesc_cargo());
			stmt.setString(8, vo.getEstado());
			stmt.setInt(9, vo.getId_oferta());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo modificar, oferta no existe o se ha dado de baja.");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public void eliminarOferta(int id_oferta) throws DAOExcepcion{
		System.out.println("OfertaDAO: eliminarOferta(int id_oferta)");
		String query = "update oferta set estado=0 where id_oferta = ? and estado = 1;";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, id_oferta);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar, oferta no existe o ya se ha dado de baja");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}	
	}
	
	public Oferta obtenerOfertaxID(int id_oferta) throws DAOExcepcion{
		System.out.println("OfertaDAO: obtenerOfertaxID(int id_oferta)");
		String query = "SELECT * FROM oferta WHERE id_oferta = ?";
		Oferta of = new Oferta();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, id_oferta);
			rs = stmt.executeQuery();
			while (rs.next()) {
				of = new Oferta();
				of.setId_oferta(rs.getInt("id_oferta"));
				of.setId_empresa(rs.getInt("id_empresa"));
				of.setTitulo(rs.getString("titulo"));
				of.setVacantes(rs.getInt("vacantes"));
				of.setFec_inicio(rs.getDate("fec_inicio"));
				of.setFec_fin(rs.getDate("fec_fin"));
				of.setCargo(rs.getInt("cargo"));
				of.setDesc_cargo(rs.getString("desc_cargo"));
				of.setEstado(rs.getString("estado"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
			return of;
	}
	
	public List<Oferta> obtenerOfertaxEmpresa(int id_empresa) throws DAOExcepcion{
		System.out.println("OfertaDAO: obtenerOfertaxEmpresa(int id_empresa)");
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		Oferta of = new Oferta();
		List<Oferta> ofertas = new ArrayList<Oferta>();
		try {
			String query = "select * from oferta o inner join empresa e on o.id_empresa = e.id_empresa where o.id_empresa = ? and o.estado = 1;";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, id_empresa);
			rs = stmt.executeQuery();
			while (rs.next()) {
				of = new Oferta();
				of.setId_oferta(rs.getInt("id_oferta"));
				of.setId_empresa(rs.getInt("id_empresa"));
				of.setTitulo(rs.getString("titulo"));
				of.setVacantes(rs.getInt("vacantes"));
				of.setFec_inicio(rs.getDate("fec_inicio"));
				of.setFec_fin(rs.getDate("fec_fin"));
				of.setCargo(rs.getInt("cargo"));
				of.setDesc_cargo(rs.getString("desc_cargo"));
				of.setEstado(rs.getString("estado"));
				ofertas.add(of);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return ofertas;
	}
}
